package com.sky.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sky.properties.BaiduMapProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * 百度地图工具类
 */
@Component
public class BaiduMapUtil {
    @Autowired
    private BaiduMapProperties baiduMapProperties;

    /**
     * 根据地址获取经纬度坐标
     * @param address 用户或商家的地址
     * @return 返回包含经纬度的JSONObject
     */
    public JSONObject getCoordinatesByAddress(String address) {
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("address", address);
        paramMap.put("output", "json");
        paramMap.put("ak", baiduMapProperties.getAk());

        String response = HttpClientUtil.doGet(baiduMapProperties.getGeocodingApi(), paramMap);
        JSONObject result = JSONObject.parseObject(response);

        if (result.getIntValue("status") == 0) {
            JSONObject location = result.getJSONObject("result").getJSONObject("location");
            return location; // 返回 { "lat": 纬度, "lng": 经度 }
        } else {
            // 地址无效或API调用失败
            return null;
        }
    }

    /**
     * 计算骑行距离（单位：米）
     * @param startLat 起始纬度
     * @param startLng 起始经度
     * @param endLat   目标纬度
     * @param endLng   目标经度
     * @return 骑行距离（米），若失败返回null
     */
    public Integer calculateRidingDistance(double startLat, double startLng, double endLat, double endLng) {
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("origin", startLat + "," + startLng);
        paramMap.put("destination", endLat + "," + endLng);
        paramMap.put("ak", baiduMapProperties.getAk());

        String response = HttpClientUtil.doGet(baiduMapProperties.getRidingApi(), paramMap);
        JSONObject result = JSONObject.parseObject(response);

        if (result.getIntValue("status") == 0) {
            // 提取骑行距离
            JSONObject route = result.getJSONObject("result").getJSONArray("routes").getJSONObject(0);
            return route.getIntValue("distance"); // 返回骑行距离（米）
        } else {
            // 路径规划失败
            return null;
        }
    }

    /**
     * 调用百度地图坐标转换接口
     *
     * @param coords 需要转换的坐标（格式：经度,纬度，多组坐标用英文分号分隔）
     * @param ak     百度地图开发者密钥（AK）
     * @param model  转换方式（默认值为1）
     * @return 转换后的坐标结果（JSON 格式）
     * @throws Exception 调用失败或返回 status != 0 时抛出异常
     */
    public JSONArray convertCoordinates(String coords, String ak, Integer model) throws Exception {
        // 构造请求参数
        Map<String, String> params = new HashMap<>();
        params.put("coords", coords);
        params.put("ak", ak);
        if (model != null) {
            params.put("model", String.valueOf(model));
        }

        // 发送 GET 请求
        String response = HttpClientUtil.doGet(baiduMapProperties.getGeoconvApi(), params);

        // 解析返回的 JSON
        JSONObject result = JSONObject.parseObject(response);
        int status = result.getIntValue("status");

        if (status != 0) {
            throw new RuntimeException("坐标转换失败，status=" + status + ", message=" + result.getString("message"));
        }

        // 返回转换结果数组
        return result.getJSONArray("result");
    }
}
